/*
6.20字典序列输出散列表
date:20201223 am 10:50
key:
1.给出元素个数不定，不要用散列表大小的数组去装
2.散列表先用一个不可能出现的元素填充，否则不知道那个位置放过没有。
*/
#include<iostream>
#include<string>
using namespace std;
int Hash(int x)
{
	return x % 11;
}
int Hash_str(string x)
{
	return int(x[0]) % 11;
}
int main()

{
	string* H = new string[12];
	string* array = new string[8];
	int n, k,i;
	string s;
	//fda sdf erf dgc hgt ret fde sgf
	//现存入一个中转数组
	for (i = 0; i < 8 ; i++)
	{
		
		cin >> array[i];
		
	}
	//用不出现的元素初始化散列表
	for (i = 0; i < 12; i++)
	{

		H[i]="-1";
		
	}

	int p;
	for (i = 0; i < 8; i++)
	{
		//提取本次array[i]的关键码
		p = Hash_str(array[i]);
		//检查本次关键码对应的位置空与否
		while (H[p] != "-1")//如果散列表大于要放的元素个数，则循环一定能结束
		{
			//保证了下一个p一定是0-11内的下一个关键码
			p = (p + 1) % 11;
		}
		H[p] = array[i];
		
	}
	//输出结果
	cout << "散列表现状\n";
	for (i = 0; i < 12; i++)
	{
		cout << H[i] << " " ;
	}
	cout << "\n";
	cout << "字典序输出散列表\n";
	//以字典序哈希寻找并输出，从a开始到z。
	for (i = 97; i < 97+26; i++)
	{
		
		//提取本次array[i]的关键码
		p = i%11;
		//检查本次关键码对应的位置空与否，但是记住H[i]的首字母是不是对应的char这里检测没意义，因为可能前面的元素线性探测输入把这个位置挤掉了。
		if (H[p] == "-1" )
		{
			continue; //空的话就能确定没有以本轮字符为第一个字符的标识符
		}
		else
		{
			//从hash到的位置开始线性遍历散列表输出对应元素
			for (k = 0; k < 11; k++)
			{
				if (int(H[p][0]) == i)//首字母要符合本轮的i
				{
					cout << H[p] << " ";
				}
				//保证了下一个p一定是0-11内的下一个关键码
				p = (p + 1) % 11;

			}
		}

		
	}
	
}